import {
    initData,
    download
} from '@/api/data';
import {
    parseTime,
    downloadFile
} from '@/utils/index';

export default {
    data() {
        return {
            // 表格数据
            data: [],
            // 排序规则，默认 id 降序， 支持多字段排序 ['id,desc', 'createTime,asc']
            sort: ['id,desc'],
            // 页码
            page: 0,
            // 每页数据条数
            size: 10,
            // 总数据条数
            total: 0,
            // 请求数据的url
            url: '',
            // 查询数据的参数
            params: {},
            // 待查询的对象
            query: {},
            // 等待时间
            time: 50,
            // 是否为新增类型的表单
            isAdd: false,
            // 导出的 Loading
            downloadLoading: false,
            // 表格 Loading 属性
            loading: true,
            // 删除 Loading 属性
            delLoading: false,
            delAllLoading: false,
            // 弹窗属性
            dialog: false,
            // Form 表单
            form: {},
            // 重置表单
            resetForm: {},
            // 标题
            title: ''
        };
    },
    methods: {
        parseTime,
        downloadFile,
        async init() {
            if (!await this.beforeInit()) {
                return;
            }
            return new Promise((resolve, reject) => {
                this.loading = true;
                // 请求数据
                initData(this.url, this.getQueryParame()).then(data => {
                    this.total = data.totalElements;
                    this.data = data.content;
                    // time 毫秒后显示表格
                    setTimeout(() => {
                        this.loading = false;
                    }, this.time);
                    resolve(data);
                }).catch(err => {
                    this.loading = false;
                    reject(err);
                });
            });
        },
        beforeInit() {
            return true;
        },
        getQueryParame: function() {
            return {
                page: this.page,
                size: this.size,
                sort: this.sort,
                ...this.query,
                ...this.params
            };
        },
        // 改变页码
        pageChange(e) {
            this.page = e - 1;
            this.init();
        },
        // 改变每页显示数
        sizeChange(e) {
            this.page = 0;
            this.size = e;
            this.init();
        },
        // 预防删除第二页最后一条数据时，或者多选删除第二页的数据时，页码错误导致请求无数据
        dleChangePage(size) {
            if (size === undefined) {
                size = 1;
            }
            if (this.data.length === size && this.page !== 0) {
                this.page = this.page - 1;
            }
        },
        // 查询方法
        toQuery() {
            this.page = 0;
            this.init();
        },
        /**
         * 通用的提示封装
         */
        submitSuccessNotify() {
            this.$notify({
                title: '提交成功',
                type: 'success',
                duration: 2500
            });
        },
        addSuccessNotify() {
            this.$notify({
                title: '新增成功',
                type: 'success',
                duration: 2500
            });
        },
        editSuccessNotify() {
            this.$notify({
                title: '编辑成功',
                type: 'success',
                duration: 2500
            });
        },
        delSuccessNotify() {
            this.$notify({
                title: '删除成功',
                type: 'success',
                duration: 2500
            });
        },
        notify(title, type) {
            this.$notify({
                title: title,
                type: type,
                duration: 2500
            });
        },
        /**
         * 删除前可以调用 beforeDelMethod 做一些操作
         */
        beforeDelMethod() {
            return true;
        },
        /**
         * 通用的删除
         */
        delMethod(id) {
            if (!this.beforeDelMethod()) {
                return;
            }
            this.delLoading = true;
            this.crudMethod.del(id).then(() => {
                this.delLoading = false;
                this.$refs[id].doClose();
                this.dleChangePage();
                this.delSuccessNotify();
                this.afterDelMethod();
                this.init();
            }).catch(() => {
                this.delLoading = false;
                this.$refs[id].doClose();
            });
        },
        afterDelMethod() {
        },
        /**
         * 多选删除提示
         */
        beforeDelAllMethod() {
            this.$confirm('你确定删除选中的数据吗？', '提示', {
                confirmButtonText: '确定',
                cancelButtonText: '取消',
                type: 'warning'
            }).then(() => {
                this.delAllMethod();
            });
        },
        /**
         * 多选删除
         */
        delAllMethod() {
            this.delAllLoading = true;
            const data = this.$refs.table.selection;
            const ids = [];
            for (let i = 0; i < data.length; i++) {
                ids.push(data[i].id);
            }
            this.crudMethod.delAll(ids).then(() => {
                this.delAllLoading = false;
                this.dleChangePage(ids.length);
                this.init();
                this.$notify({
                    title: '删除成功',
                    type: 'success',
                    duration: 2500
                });
            }).catch(() => {
                this.delAllLoading = false;
            });
        },
        /**
         * 显示新增弹窗前可以调用该方法
         */
        beforeShowAddForm() {
        },
        /**
         * 显示新增弹窗
         */
        showAddFormDialog() {
            this.isAdd = true;
            this.resetForm = JSON.parse(JSON.stringify(this.form));
            this.beforeShowAddForm();
            this.dialog = true;
        },
        /**
         * 显示编辑弹窗前可以调用该方法
         */
        beforeShowEditForm(data) {
        },
        /**
         * 显示编辑弹窗
         */
        showEditFormDialog(data = '') {
            this.isAdd = false;
            if (data) {
                this.resetForm = JSON.parse(JSON.stringify(this.form));
                this.form = JSON.parse(JSON.stringify(data));
            }
            this.beforeShowEditForm(data);
            this.dialog = true;
        },
        /**
         * 新增方法
         */
        addMethod() {
            this.crudMethod.add(this.form).then(() => {
                this.addSuccessNotify();
                this.loading = false;
                this.afterAddMethod();
                this.cancel();
                this.init();
            }).catch(() => {
                this.loading = false;
                this.afterAddErrorMethod();
            });
        },
        /**
         * 新增后可以调用该方法
         */
        afterAddMethod() {
        },
        /**
         * 新增失败后调用该方法
         */
        afterAddErrorMethod() {
        },
        /**
         * 通用的编辑方法
         */
        editMethod() {
            this.crudMethod.edit(this.form).then(() => {
                this.editSuccessNotify();
                this.loading = false;
                this.afterEditMethod();
                this.cancel();
                this.init();
            }).catch(() => {
                this.loading = false;
            });
        },
        /**
         * 编辑后可以调用该方法
         */
        afterEditMethod() {
        },
        /**
         * 提交前可以调用该方法
         */
        beforeSubmitMethod() {
            return true;
        },
        /**
         * 提交
         */
        submitMethod() {
            if (!this.beforeSubmitMethod()) {
                return;
            }
            if (this.$refs['form']) {
                this.$refs['form'].validate((valid) => {
                    if (valid) {
                        this.loading = true;
                        if (this.isAdd) {
                            this.addMethod();
                        } else this.editMethod();
                    }
                });
            }
        },
        /**
         * 隐藏弹窗
         */
        cancel() {
            this.dialog = false;
            if (this.$refs['form']) {
                this.$refs['form'].clearValidate();
                this.form = this.resetForm;
            }
        },
        /**
         * 获取弹窗的标题
         */
        getFormTitle() {
            return this.isAdd ? `新增${this.title}` : `编辑${this.title}`;
        },
        /**
         * 通用导出
         */
        downloadMethod() {
            this.beforeInit();
            this.downloadLoading = true;
            download(this.url + '/download', this.params).then(result => {
                this.downloadFile(result, this.title + '数据', 'xlsx');
                this.downloadLoading = false;
            }).catch(() => {
                this.downloadLoading = false;
            });
        }
    }
};
